<!--

    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/jdbcConnectionPools.jsf -->

<!initPage
  setResourceBundle(key="i18njdbc" bundle="org.glassfish.jdbc.admingui.Strings");
    setResourceBundle(key="help_jdbc" bundle="org.glassfish.jdbc.admingui.Helplinks");
/>
<!composition template="/templates/default.layout"
    guiTitle="$resource{i18njdbc.jdbcConnectionPools.pageTitle}"
    guiTemplateOnLoad="admingui.nav.refreshTree('treeForm:tree:resources:JDBC');"
>
<!define name="content">
    <event>
        <!beforeCreate
            setPageSessionAttribute(key="editLink" value="#{request.contextPath}/jdbc/jdbcConnectionPoolEdit.jsf");
            setPageSessionAttribute(key="createLink" value="#{request.contextPath}/jdbc/jdbcConnectionPoolNew1.jsf");
            setPageSessionAttribute(key="listLink" value="#{request.contextPath}/jdbc/jdbcConnectionPools.jsf");
            setPageSessionAttribute(key="resourceType" value="jdbcConnectionPool");
            setPageSessionAttribute(key="jdbcpool" value="#{true}" );
            setPageSessionAttribute(key="childType" value="jdbc-connection-pool");
            setPageSessionAttribute(key="dependentType" value="jdbc-resource");

            setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/resources");
            setPageSessionAttribute(key="rest-api" value="true");
            gf.getChildList(parentEndpoint="#{pageSession.parentUrl}", childType="#{pageSession.childType}", result="#{requestScope.listOfRows}");
            gf.addClassNameColumn(poolsData="#{requestScope.listOfRows}" result="#{requestScope.listOfRows}");
            setPageSessionAttribute(key="confirmDeleteMsg" value="$resource{i18n.msg.JS.confirmDeletePools}");
            setPageSessionAttribute(key="tableTitle" value="$resource{i18njdbc.resourcesTable.Pools}");
            setPageSessionAttribute(key="resHeader" value="$resource{i18njdbc.resourcesTable.colResType}");
        />
    </event>
"    <script type="text/javascript">admingui.nav.selectTreeNodeById(admingui.nav.TREE_ID+":resources:JDBC:connectionPoolResources");</script>
            <sun:form id="propertyForm">
#include "/common/shared/alertMsg_1.inc"
                 <sun:title id="propertyContentPage" title="$resource{i18njdbc.jdbcConnectionPools.pageTitle}"
                 helpText="$resource{i18njdbc.jdbcConnectionPools.pageTitleHelp}"/>
     "<br /><br />

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