Details
-
Type: Improvement
-
Status: Closed
-
Priority: Major
-
Resolution: Fixed
-
Affects Version/s: 2.0-Alpha3
-
Fix Version/s: 2.0.0
-
Component/s: ICE-Components
-
Labels:None
-
Environment:compat
Description
It should be possible to find all of these, by searching for "hidden" in the source code, so that they can be enumerated, and hopefully removed, thus removing the need for resetHiddenFields() itself. Likely, uses can be replaced with parameters to iceSubmit() and iceSubmitPartial(). An alternate strategy is depicted in
-
- screenshot-01.png
- 84 kB
-
- screenshot-02.png
- 83 kB
-
- screenshot-03.png
- 181 kB
-
- screenshot-04.png
- 188 kB
-
- screenshot-05.png
- 274 kB
Issue Links
- blocks
-
ICE-5796 Try to eliminate resetHiddenFields() function in Compat Comps.
- Closed
Activity
- All
- Comments
- History
- Activity
- Remote Attachments
- Subversion
These are all instances in compat of creation of hidden input fields which have their name specified, but not an id, which would make resetHiddenFields() clear them after a submit:
icefaces2/compat/core/src/main/java/com/icesoft/faces/application/ExtrasSetup.java
com.icesoft.faces.application.ExtrasSetup.FormHiddenInputFieldsRenderer#encode
writer.startElement("input", component);
writer.writeAttribute("type", "hidden", null);
writer.writeAttribute("name", CurrentStyle.CSS_UPDATE_FIELD, null);
writer.writeAttribute("value", "", null);
writer.endElement("input");
Same method, further down
if (FormRenderer.COMMAND_LINK_HIDDEN_FIELD.equals(nextField.getValue()))
icefaces2/compat/components/src/main/java/com/icesoft/faces/component/ext/renderkit/TableRenderer.java
com.icesoft.faces.component.ext.renderkit.TableRenderer#encodeChildren
//rowSelectedField.setAttribute(HTML.ID_ATTR, paramId);
rowSelectedField.setAttribute(HTML.NAME_ATTR, paramId);
rowSelectedField.setAttribute(HTML.TYPE_ATTR, "hidden");
hiddenInputNode = rowSelectedField;
rowSelectionFunctionName = "Ice.tableRowClicked";
Element clickedRowField = domContext.createElement(HTML.INPUT_ELEM);
String clickedRowParam = getClickedRowParameterName(uiComponent.getClientId(facesContext));
clickedRowField.setAttribute(HTML.TYPE_ATTR, "hidden");
clickedRowField.setAttribute(HTML.NAME_ATTR, clickedRowParam);
Element clickCountField = domContext.createElement(HTML.INPUT_ELEM);
String clickCountParam = getClickCountParameterName(uiComponent.getClientId(facesContext));
clickCountField.setAttribute(HTML.TYPE_ATTR, "hidden");
clickCountField.setAttribute(HTML.NAME_ATTR, clickCountParam);
icefaces2/compat/components/src/main/java/com/icesoft/faces/component/panelcollapsible/PanelCollapsibleRenderer.java
com.icesoft.faces.component.panelcollapsible.PanelCollapsibleRenderer#encodeBegin
Element hiddenField = domContext.createElement(HTML.INPUT_ELEM);
hiddenField.setAttribute(HTML.NAME_ATTR, uiComponent.getClientId(facesContext) + "Expanded");
hiddenField.setAttribute(HTML.TYPE_ATTR, "hidden");
icefaces2/compat/components/src/main/java/com/icesoft/faces/component/tree/TreeRenderer.java
com.icesoft.faces.component.tree.TreeRenderer#encodeEnd
Element hiddenTreeAction = domContext.createElement(HTML.INPUT_ELEM);
hiddenTreeAction.setAttribute(HTML.TYPE_ATTR, "hidden");
hiddenTreeAction.setAttribute(HTML.NAME_ATTR, CustomComponentUtils.getHiddenTreeActionFieldName(
uiComponent.getClientId(
facesContext),
CustomComponentUtils.getFormName(
uiComponent,
facesContext)));
icefaces2/compat/core/src/main/java/com/icesoft/faces/renderkit/dom_html_basic/FormRenderer.java
com.icesoft.faces.renderkit.dom_html_basic.FormRenderer#encodeBegin
Element formHiddenField = domContext.createElement("input");
formHiddenField.setAttribute("type", "hidden");
formHiddenField.setAttribute("name", formClientId);
formHiddenField.setAttribute("value", formClientId);
Same method, further down
Element encodedURLField = domContext.createElement("input");
encodedURLField.setAttribute("type", "hidden");
encodedURLField.setAttribute("name", "javax.faces.encodedURL");
encodedURLField.setAttribute("value", encodedPartialActionURL);
Same method, further down
Element conversationIDElement =
domContext.createElement(HTML.INPUT_ELEM);
if (log.isLoggable(Level.FINE))
conversationIDElement
.setAttribute(HTML.TYPE_ATTR, HTML.INPUT_TYPE_HIDDEN);
conversationIDElement
.setAttribute(HTML.NAME_ATTR, conversationParamName);
conversationIDElement.setAttribute(HTML.VALUE_ATTR, conversationId);
icefaces2/compat/components/src/main/java/com/icesoft/faces/component/selectinputtext/SelectInputTextRenderer.java
com.icesoft.faces.component.selectinputtext.SelectInputTextRenderer#encodeBegin
Element index = domContext.createElement(HTML.INPUT_ELEM);
index.setAttribute(HTML.TYPE_ATTR, HTML.INPUT_TYPE_HIDDEN);
String indexId = ClientIdPool.get(clientId + AUTOCOMPLETE_INDEX);
index.setAttribute(HTML.NAME_ATTR, indexId);
This is the opposite scenario, which isn't really about resetHiddenFields(), but raises the question as to whether this works in all browsers, since the hidden input field's id is specified, but not the name.
icefaces2/compat/components/src/main/java/com/icesoft/faces/component/panelconfirmation/PanelConfirmationRenderer.java
com.icesoft.faces.component.panelconfirmation.PanelConfirmationRenderer#encodeEnd
Element clientOnly = domContext.createElement(HTML.INPUT_ELEM);
clientOnly.setAttribute(HTML.TYPE_ATTR, "hidden");
clientOnly.setAttribute(HTML.ID_ATTR, id + "clientOnly");
icefaces2/compat/components/src/main/java/com/icesoft/faces/component/panelpopup/PanelPopupRenderer.java
com.icesoft.faces.component.panelpopup.PanelPopupRenderer#encodeBegin
Element clientOnly = domContext.createElement(HTML.INPUT_ELEM);
clientOnly.setAttribute(HTML.TYPE_ATTR, "hidden");
clientOnly.setAttribute(HTML.ID_ATTR, clientId + "clientOnly");
To be thorough, here are instances in the core, and not compat, where hidden input fields have a name but no id. In a compat environment, these still may be in play. Without understanding this code, it looks like the possibility exists of losing the window and view ids after an initial postback.
icefaces2/core/src/main/java/org/icefaces/impl/event/WindowAndViewIDSetup.java
org.icefaces.impl.event.UIOutputWriter#encode
writer.startElement("input", this);
writer.writeAttribute("type", "hidden", null);
writer.writeAttribute("name", "ice.window", null);
writer.writeAttribute("value", WindowScopeManager.lookupWindowScope(context).getId(), null);
writer.endElement("input");
writer.startElement("input", this);
writer.writeAttribute("type", "hidden", null);
writer.writeAttribute("name", "ice.view", null);
writer.writeAttribute("value", requestMap.get(BridgeSetup.ViewState), null);
writer.endElement("input");
To be thorough, here are instances in the core opposite scenario, where the hidden input field's id is specified, but not the name.
icefaces2/core/src/main/java/org/icefaces/impl/event/FormSubmit.java
org.icefaces.impl.event.AjaxDisabledWriter#encode
writer.startElement("input", this);
writer.writeAttribute("type", "hidden", "type");
writer.writeAttribute("id", getClientId(context), "id");
writer.writeAttribute("disabled", "true", "disabled");
writer.writeAttribute("value", value, "value");
writer.endElement("input");
In summary: resetHiddenFields() should be removed and ice:commandLink, row selection, PanelCollapsible, Tree, SelectInputText need to be verified and possibly modified to clear their field after submission. (Note that a strategy for future components is to use a single "event" field that would be cleared automatically – these would be components implemented with the understanding that only one of them could be active per request.)
CurrentStyle.CSS_UPDATE_FIELD
- if the bridge is extracting a value from this field, it should
be cleared after the value is taken
FormRenderer.COMMAND_LINK_HIDDEN_FIELD
- should be cleared after form submission
TableRenderer paramId
clickedRowParam
clickCountParam
- appear to be for row selection, so should be cleared after form submission
uiComponent.getClientId(facesContext) + "Expanded"
- likely should be cleared after form is submitted
getHiddenTreeActionFieldName
- likely should be cleared after form is submitted
FormRenderer formClientId
- no need to clear
conversationParamName
- will be updated from server if necessary
SelectInputTextRenderer indexId
- likely should be cleared before form submission
ice.window
ice.view
AjaxDisabledWriter
- these fields are only at risk from resetHiddenFields, no need to clear
Specific components have been identified that require attention when resetHiddenFields() is removed. These components can be tested and modified before the complete change is checked in.
resetHiddenFieldsFor() present in iceSubmit() and iceSubmitPartial(), i.e. all scenarios using iceSubmit() and iceSubmitPartial() need to be examined. Changes in simpler scenario of collapsible panel tried out first. See screenshots 1 and 2.
But didn't we once spend a lot of time doing similar changes for all components and then all those changes were abandoned?
Revision: 23231
Modified : /icefaces2/trunk/icefaces/compat/components/src/main/java/com/icesoft/faces/component/panelcollapsible/PanelCollapsibleRenderer.java
Modified : /icefaces2/trunk/icefaces/compat/core/src/main/javascript/submit.js
Wrong approach. Should keep hidden fields and reset them by components themselves instead of relying on iceSubmit() and iceSubmitPartial() to do it.
Revision: 23244
Modified : /icefaces2/trunk/icefaces/compat/components/src/main/java/com/icesoft/faces/component/panelcollapsible/PanelCollapsibleRenderer.java
Modified : /icefaces2/trunk/icefaces/compat/core/src/main/javascript/submit.js
SelectInputTextRenderer: already done in original code. See screenshot 3.
TableRenderer paramId: already done in original code. See screenshot 4.
Rest of TableRenderer done.
Revision: 23251
Modified : /icefaces2/trunk/icefaces/compat/core/src/main/javascript/extras/extras.js
HiddenTreeActionFieldName: can't find its usage at all after global search and studying code, not in decode(), not in any JS. The field is just created and never used?
com.icesoft.faces.context.effects.CurrentStyle#CSS_UPDATE_FIELD done.
Revision: 23253
Modified : /icefaces2/trunk/icefaces/compat/core/src/main/javascript/extras/extras.js
com.icesoft.faces.renderkit.dom_html_basic.FormRenderer#COMMAND_LINK_HIDDEN_FIELD is not just used in command link, but a number of other components (drag and drop, table, chart, popup, tabset, calendar, etc.) Need to check them all.
COMMAND_LINK_HIDDEN_FIELD in Drag and Drop: already done in original code. See screenshot 5.
COMMAND_LINK_HIDDEN_FIELD in TableRenderer done.
Revision: 23269
Modified : /icefaces2/trunk/icefaces/compat/core/src/main/javascript/extras/extras.js
COMMAND_LINK_HIDDEN_FIELD in OutputChart done.
Revision: 23270
Modified : /icefaces2/trunk/icefaces/compat/components/src/main/java/com/icesoft/faces/component/outputchart/OutputChart.java
COMMAND_LINK_HIDDEN_FIELD in PanelPopupRenderer: same as in Drag and Drop.
COMMAND_LINK_HIDDEN_FIELD in PanelTabSetRenderer done.
Revision: 23279
Modified : /icefaces2/trunk/icefaces/compat/components/src/main/java/com/icesoft/faces/component/paneltabset/PanelTabSetRenderer.java
COMMAND_LINK_HIDDEN_FIELD in SelectInputDateRenderer done.
Revision: 23283
Modified : /icefaces2/trunk/icefaces/compat/components/src/main/java/com/icesoft/faces/component/selectinputdate/SelectInputDateRenderer.java
COMMAND_LINK_HIDDEN_FIELD in CommandLinkRenderer done.
Revision: 23286
Modified : /icefaces2/trunk/icefaces/compat/components/src/main/java/com/icesoft/faces/component/ext/renderkit/CommandLinkRenderer.java
Modified : /icefaces2/trunk/icefaces/compat/core/src/main/java/com/icesoft/faces/renderkit/dom_html_basic/CommandLinkRenderer.java
resetHiddenFieldsFor() removed.
Revision: 23287
Modified : /icefaces2/trunk/icefaces/compat/core/src/main/javascript/submit.js
Code in submit.js verified to match earlier prototype work.
First remove uses of the API, then remove the API itself, so that the icefaces2 trunk always functions properly.