<!--

    Copyright (c) 2009, 2018 Oracle and/or its affiliates. All rights reserved.

    This program and the accompanying materials are made available under the
    terms of the Eclipse Public License v. 2.0, which is available at
    http://www.eclipse.org/legal/epl-2.0.

    This Source Code may also be made available under the following Secondary
    Licenses when the conditions for such availability set forth in the
    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
    version 2 with the GNU Classpath Exception, which is available at
    https://www.gnu.org/software/classpath/license.html.

    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0

-->

<!-- uploadComponent.inc -->

<sun:propertySheet id="sheet1" requiredFields="true">

#include "/common/applications/fileComponent.jsf"

    <sun:propertySheetSection>
        <sun:property id="type" labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n.common.TypeLabel}"  visible="#{true}" >
            <sun:dropDown id="appType" selected="#{pageSession.appType}" required="#{true}" value="" labels="$attribute{labels}" values="$attribute{values}"
                onChange="javascript:admingui.deploy.showPropertySheet(this.value, window, '#{appNameId}', '#{contextRootId}', '#{sessionScope.appTypeString}' )" >
                <!beforeCreate
                    getContentOfIntegrationPoints(type="org.glassfish.admingui:appTypeDropdown" labels="#{requestScope.labels}" values="#{requestScope.values}" );
                    listAdd(list="#{requestScope.labels}" value="",  index="0");
                    listAdd(list="#{requestScope.values}" value=""  index="0" );
                    convertListToCommaString(list="#{requestScope.values}" commaString="#{sessionScope.appTypeString}");
                />
                <!afterCreate
                    getClientId(component="$this{component}" clientId=>$page{typeId});
                />
            </sun:dropDown>
            <!afterCreate
                getClientId(component="$this{component}" clientId=>$page{dropDownProp});
            />
        </sun:property>
    </sun:propertySheetSection>
</sun:propertySheet>
<event>
    <!afterCreate
        getUIComponent(clientId="#{formId}"  component=>$attribute{component})
        includeIntegrations(type="org.glassfish.admingui:uploadPropertySheet" );
        setPageSessionAttribute(key="setDefaultTarget" value="true");
        includeIntegrations(type="org.glassfish.admingui:uploadPropertySheetTargetSection" );
    />
</event>
