<!--

    Copyright (c) 1997, 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

-->

<!-- jdbc/jdbcResourceNew.jsf -->

<!initPage
    setResourceBundle(key="i18njdbc" bundle="org.glassfish.jdbc.admingui.Strings");
    setResourceBundle(key="help_jdbc" bundle="org.glassfish.jdbc.admingui.Helplinks")
    setAttribute(key="edit" value="#{false}");
/>
<!composition template="/templates/default.layout"  guiTitle="$resource{i18njdbc.jdbcResource.newPageTitle}" >
<!define name="content">
    <event>
    <!beforeCreate
        getRequestValue(key="target" value="#{pageSession.targetValue}");
        setPageSessionAttribute(key="parentPage" value="#{request.contextPath}/jdbc/jdbcResources.jsf");
        setPageSessionAttribute(key="childType" value="jdbc-resource");
        setPageSessionAttribute(key="convertToFalseList" value={"enabled"});
        setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/resources");
        gf.getDefaultValues(endpoint="#{pageSession.parentUrl}/#{pageSession.childType}", valueMap="#{pageSession.valueMap}");
        //set the following for including buttons.inc
        setPageSessionAttribute(key="edit" value="#{false}" );
        setPageSessionAttribute(key="showDefaultButton" value="#{true}" );
        setPageSessionAttribute(key="showCancelButton" value="#{true}" );
        setPageSessionAttribute(key="hasPropertySheet" value="#{true}" );
        setPageSessionAttribute(key="hasPropertyTable" value="#{true}" );

        createMap(result="#{pageSession.valueMap2}")
        mapPut(map="#{pageSession.valueMap}" key="enabled" value="true");
        mapPut(map="#{pageSession.valueMap2}" key="enabled" value="true");
        setPageSessionAttribute(key="useString" value="#{false}");
    />
    </event>
    "    <script type="text/javascript">admingui.nav.selectTreeNodeById(admingui.nav.TREE_ID+":resources:JDBC:jdbcResources");</script>
            <sun:form id="form">
#include "/common/shared/alertMsg_1.inc"

                <!-- Page Title -->
                <sun:title id="propertyContentPage" title="$resource{i18njdbc.jdbcResource.newPageTitle}" helpText="$resource{i18njdbc.jdbcResource.newPageTitleHelp}">
#include "/common/resourceNode/resourceEditPageButtons.inc"
                    </sun:title>
                    "<br><br>

#include "/jdbc/jdbcResource.inc"
#include "/common/shared/propertyDescTable.inc"
<event>
<!afterCreate
    setPageSessionAttribute(key="setDefaultTarget" value="true");
    includeIntegrations(type="org.glassfish.admingui:TargetSectionForResource" );
/>
</event>


	<sun:hidden id="helpKey" value="$resource{help_jdbc.jdbcResourceNew}" />
            </sun:form>
                        "<br/>
#include "/common/shared/changeButtonsJS.inc" 
</define>
</composition>
