0

I'm trying to get the selected item from my selectOneMenu onchange but it's not working. Every time I change the drop down and select another option, the console on my web browser says

The value of the property 'getOffset' is null or undefined, not a Function object

This is my .xhtml page named ProgramDetails.xhtml

<h:dataTable id="DispatchConfigurationCustom" columnClasses="portlet-table-same portlet-table-cell" headerClass="portlet-table-same portlet-table-cell" value="#{CRUDOperatorProgram.workflowStepList}" var="workflowConfig" width="100%">
<h:column>
    <f:facet name="header">
        <h:outputText value="Include" />
    </f:facet>
    <h:selectBooleanCheckbox id="includeInd" value="#{workflowConfig.isIncludedInd}"/>
</h:column>
<h:column>
    <f:facet name="header">
        <h:outputText value="Automate" />
    </f:facet>
    <h:selectOneRadio id="onOff" value="#{workflowConfig.isAutomatedInd}">
        <f:selectItem id="onButton" itemLabel="On" itemValue="1" />
        <f:selectItem id="offButton" itemLabel="Off" itemValue="0" />
    </h:selectOneRadio>
</h:column>
<h:column>
    <f:facet name="header">
        <h:outputText value="Action Step" />
    </f:facet>
    <h:outputText value="#{workflowConfig.workflowStep.displayLabel}" />
</h:column>
<h:column>
    <f:facet name="header">
        <h:outputText value="Offset Prior" />
    </f:facet>
    <label for="offsetPriorBoxHour"><h:outputText value="hrs:" rendered="#{workflowConfig.workflowStep.displayLabel == 'Curtail Notification'}" /></label>
    <h:selectOneMenu styleClass="portlet-dropdown"  rendered="#{workflowConfig.workflowStep.displayLabel == 'Curtail Notification'}"  id="offsetPriorBoxHour" value="#{workflowConfig.offsetMinutes}" onchange="getOffset(this);">
        <f:selectItems value="${CRUDOperatorProgram.hourList}" />
    </h:selectOneMenu>
    <label for="offsetPriorBoxMin"><h:outputText value="min:" rendered="#{workflowConfig.workflowStep.displayLabel == 'Curtail Notification' or workflowConfig.workflowStep.displayLabel == 'Multisite Follow Up' or workflowConfig.workflowStep.displayLabel == 'Curtail Toggle'}" /></label>
    <h:selectOneMenu styleClass="portlet-dropdown"  rendered="#{workflowConfig.workflowStep.displayLabel == 'Curtail Notification' or workflowConfig.workflowStep.displayLabel == 'Multisite Follow Up' or workflowConfig.workflowStep.displayLabel == 'Curtail Toggle'}"  id="offsetPriorBoxMin" value="#{workflowConfig.offsetMinutes}" onchange="getOffset(this);">
        <f:selectItems value="${CRUDOperatorProgram.minuteList}" />
    </h:selectOneMenu>
</h:column>
<h:column>
    <f:facet name="header">
        <h:outputText value="Offset After" />
    </f:facet>
    <label for="offsetAfterBoxMin"><h:outputText value="min:" rendered="#{workflowConfig.workflowStep.displayLabel == 'Restore Notification' or workflowConfig.workflowStep.displayLabel == 'Overlapping Follow Up' or workflowConfig.workflowStep.displayLabel == 'Restore'}" /></label>
    <h:selectOneMenu styleClass="portlet-dropdown"  rendered="#{workflowConfig.workflowStep.displayLabel == 'Restore Notification' or workflowConfig.workflowStep.displayLabel == 'Overlapping Follow Up' or workflowConfig.workflowStep.displayLabel == 'Restore'}"  id="offsetAfterBoxMin" value="#{workflowConfig.offsetMinutes}" onchange="getOffset(this);">
        <f:selectItems value="${CRUDOperatorProgram.minuteList}" />
    </h:selectOneMenu>
</h:column>
<h:column>
    <f:facet name="header">
        <h:outputText value="Offset Target" />
    </f:facet>
    <h:outputText rendered="#{workflowConfig.workflowStep.displayLabel == 'Curtail Notification' or workflowConfig.workflowStep.displayLabel == 'Multisite Follow Up' or workflowConfig.workflowStep.displayLabel == 'Curtail Toggle'}"  id="offsetTargetStartBox" value="Start" />
    <h:outputText rendered="#{workflowConfig.workflowStep.displayLabel == 'Restore Notification' or workflowConfig.workflowStep.displayLabel == 'Overlapping Follow Up' or workflowConfig.workflowStep.displayLabel == 'Restore'}"  id="offsetTargetEndBox" value="End" />
</h:column>
<h:column>
    <f:facet name="header">
        <h:outputText value="Offset Summary" />
    </f:facet>
    <h:outputText rendered="#{workflowConfig.workflowStep.displayLabel == 'Curtail Notification' or workflowConfig.workflowStep.displayLabel == 'Multisite Follow Up' or workflowConfig.workflowStep.displayLabel == 'Curtail Toggle'}"  id="offsetSummaryBeforeBox" value="before Start time" />
    <h:outputText rendered="#{workflowConfig.workflowStep.displayLabel == 'Restore Notification' or workflowConfig.workflowStep.displayLabel == 'Overlapping Follow Up' or workflowConfig.workflowStep.displayLabel == 'Restore'}"  id="offsetSummaryAfterBox" value="after End time" />
</h:column>
<script>
    function getOffset( dropdown ) {
        var minutesTemp = dropdown.options[dropdown.selectedIndex].value;
        var minutes = minutesTemp.toString();
        alert("Minutes: " + minutes);
    // <![CDATA[
        if(document.getElementById('ProgramDetails:DispatchConfigurationCustom:0:offsetPriorBoxHour') != null) {
            var hourBox = document.getElementById('ProgramDetails:DispatchConfigurationCustom:0:offsetPriorBoxHour');
            var hourTemp = hourBox.options[hourBox.selectedIndex].value;
            var hour = hourTemp.toString();
            document.getElementById('ProgramDetails:DispatchConfigurationCustom:0:offsetSummaryBeforeBox').value = hours + " hours and " + minutes + " minutes before Start time";
        } else if(document.getElementById('ProgramDetails:DispatchConfigurationCustom:0:offsetSummaryBeforeBox') != null) {
            document.getElementById('ProgramDetails:DispatchConfigurationCustom:0:offsetSummaryBeforeBox').value = minutes + " minutes before Start time";
        } else { 
            document.getElementById('ProgramDetails:DispatchConfigurationCustom:0:offsetSummaryAfterBox').value = minutes + " minutes before Start time";
        }
        //]]>
    }

</script>
</h:dataTable>  

These are my hourList and minuteList methods that are populating the selectOneMenu...

private void loadMinuteList() {
    minuteList = new ArrayList<SelectItem>();
    for(Integer i=0; i<=60; i++){
        minuteList.add(new SelectItem(i, i.toString()));
    }
}

private void loadHourList() {
    hourList = new ArrayList<SelectItem>();
    for(Integer i=0; i<=30; i++){
        hourList.add(new SelectItem(i, i.toString()));
    }
}

Sorry for all the long code blocks. I'm just trying to give you the most information I can. Is there something wrong with the way I am using javascript? Or the onchange=""?

Zack
  • 5,108
  • 4
  • 27
  • 39
  • From the actual code, it's hard to define what the problem could be. It will be better if you analyze the generated HTML code (or post it to see what could be happening). – Luiggi Mendoza Nov 15 '12 at 07:02
  • @LuiggiMendoza I have looked at the generated HTML code and since this I'm using java beans and jsf, the id that I set to the changes when the html loads. In this example, the id of offsetSummaryAfterBox changes to ProgramDetails:DispatchConfigurationCustom:0:offsetSummaryAfterBox. This might not be the main problem causing this error. But I do need to find a way to differentiate which offsetSummaryAfterBox I am editing. Example: (ProgramDetails:DispatchConfigurationCustom:0:offsetSummaryAfterBox) vs. (ProgramDetails:DispatchConfigurationCustom:1:offsetSummaryAfterBox) – Zack Nov 15 '12 at 13:25
  • @LuiggiMendoza If you want more information I'd be happy to take you in chat or on another resource. Thanks so much – Zack Nov 15 '12 at 13:26

2 Answers2

1

You have 2 issues in your script :

var minutesTemp = dropdown.options[dropdown.selectedIndex].value.;

Remove the additional . at the end

and

else (document.getElementById('ProgramDetails:DispatchConfigurationCustom:0:offsetSummaryBeforeBox') != null) {
   document.getElementById('ProgramDetails:DispatchConfigurationCustom:0:offsetSummaryBeforeBox').value = minutes + " minutes before Start time";
}

should be

else if (document.getElementById('ProgramDetails:DispatchConfigurationCustom:0:offsetSummaryBeforeBox') != null) {
   document.getElementById('ProgramDetails:DispatchConfigurationCustom:0:offsetSummaryBeforeBox').value = minutes + " minutes before Start time";
}

ie add an if after the else - you cannot check a condition when using else unless you include if too

Manse
  • 37,765
  • 10
  • 83
  • 108
  • Thanks. I removed the "." but still get the same error. I did have an else if in there along with many other checks, but I took them out to make the code smaller. Any other ideas? Is there a way for me to differentiate between 'ProgramDetails:DispatchConfigurationCustom:0:offsetSummaryBeforeBox' and 'ProgramDetails:DispatchConfigurationCustom:1:offsetSummaryBeforeBox' ? – Zack Nov 14 '12 at 14:30
  • @Zack If you have other code then please include it in your question - the problem is that the JavaScript simply isn't valid - only including part of it won't help – Manse Nov 14 '12 at 14:33
0

Please try this:

<h:selectOneMenu styleClass="portlet-dropdown"  rendered="#{workflowConfig.workflowStep.displayLabel == 'Restore Notification' or workflowConfig.workflowStep.displayLabel == 'Overlapping Follow Up' or workflowConfig.workflowStep.displayLabel == 'Restore'}"  id="offsetAfterBoxMin" value="#{workflowConfig.offsetMinutes}" onchange="getOffset(offsetAfterBoxMin[index].value);">
    <f:selectItems value="${CRUDOperatorProgram.minuteList}" />
</h:selectOneMenu>

and remove the : var minutesTemp = dropdown.options[dropdown.selectedIndex].value; OR

<h:selectOneMenu styleClass="portlet-dropdown"  rendered="#{workflowConfig.workflowStep.displayLabel == 'Restore Notification' or workflowConfig.workflowStep.displayLabel == 'Overlapping Follow Up' or workflowConfig.workflowStep.displayLabel == 'Restore'}"  id="offsetAfterBoxMin" value="#{workflowConfig.offsetMinutes}">
    <f:selectItems value="${CRUDOperatorProgram.minuteList}" />
    <f:ajax event="valueChange" execute="getOgetOffset(offsetAfterBoxMin[index].value);"/>
</h:selectOneMenu>
TalesTk
  • 181
  • 3