<!--

    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

-->

<!-- jca/jcaResources.jsf -->

<!initPage
    setResourceBundle(key="i18njca" bundle="org.glassfish.jca.admingui.Strings");
    setResourceBundle(key="help_jca" bundle="org.glassfish.jca.admingui.Helplinks")
/>
<!composition template="/templates/default.layout"
    guiTitle="$resource{i18njca.resourceAdapterConfig.pageTitle}"
    guiTemplateOnLoad="admingui.nav.refreshTree('treeForm:tree:resources:resourceAdapterConfigs');"
>
<!define name="content">
    <event>
    <!beforeCreate
        getRequestValue(key="configName" value=>$page{configName} default="server-config");
        setPageSessionAttribute(key="childType" value="resource-adapter-config");
        setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/resources");
        gf.getChildList(parentEndpoint="#{pageSession.parentUrl}", childType="#{pageSession.childType}", result="#{requestScope.listOfRows}", id="resourceAdapterName");
        setPageSessionAttribute(key="confirmDeleteMsg" value="$resource{i18njca.msg.JS.confirmDeleteAC}");
        setPageSessionAttribute(key="createLink" value="#{request.contextPath}/jca/resourceAdapterConfigNew.jsf");
        setPageSessionAttribute(key="listLink" value="#{request.contextPath}/jca/resourceAdapterConfigs.jsf");
        setPageSessionAttribute(key="editLink" value="#{request.contextPath}/jca/resourceAdapterConfigEdit.jsf");
        setPageSessionAttribute(key="editPoolLink" value="#{request.contextPath}/jca/resourceAdapterConfigEdit.jsf");
        setPageSessionAttribute(key="tableTitle" value="$resource{i18njca.resourceAdapterConfig.configs}");
        setPageSessionAttribute(key="resHeader" value="$resource{i18njca.resourcesTable.colResAdapter}");
        setPageSessionAttribute(key="hasConfDef" value="#{false}" );
        setPageSessionAttribute(key="hasDesc" value="#{false}" );
    />
    </event>
"    <script type="text/javascript">admingui.nav.selectTreeNodeById(admingui.nav.TREE_ID+":resources:resourceAdapterConfigs");</script>

            <sun:form id="propertyForm">
#include "/common/shared/alertMsg_1.inc"
                 <sun:title id="propertyContentPage" title="$resource{i18njca.resourceAdapterConfig.pageTitle}"
                 helpText="$resource{i18njca.resourceAdapterConfig.pageTitleHelp}" />
     "<br /> <br />

<sun:table id="poolTable" title="#{tableTitle}"
        deselectMultipleButton="$boolean{true}"
            deselectMultipleButtonOnClick="setTimeout('admingui.table.changeOneTableButton(\\\\\'#{pageSession.topActionGroup}\\\\\', \\\\\'#{pageSession.tableId}\\\\\');', 0)"
            selectMultipleButton="$boolean{true}"
            selectMultipleButtonOnClick="setTimeout('admingui.table.changeOneTableButton(\\\\\'#{pageSession.topActionGroup}\\\\\', \\\\\'#{pageSession.tableId}\\\\\');', 0)" >
            <!afterCreate
                getClientId(component="$this{component}" clientId=>$page{tableId});
            />

#include "/jca/poolTableButtons.inc"

   <sun:tableRowGroup id="rowGroup1" selected="#{td.value.selected}" data={"$attribute{listOfRows}"} sourceVar="td">
     <!afterCreate
         getClientId(component="$this{component}" clientId=>$page{tableRowGroupId});
        />
   <sun:tableColumn headerText="$resource{i18n.common.SelectHeader}" selectId="select" rowHeader="$boolean{false}" id="col0">
            <sun:checkbox id="select"
                toolTip="$resource{i18n.common.select}"
                selected="#{td.value.selected}"
                selectedValue="$boolean{true}"
                onClick="setTimeout('admingui.table.changeOneTableButton(\\\\\'#{pageSession.topActionGroup}\\\\\', \\\\\'#{pageSession.tableId}\\\\\'); admingui.table.initAllRows(\\\\\'#{pageSession.tableId}\\\\\');', 0);"
            />
    </sun:tableColumn>

    <sun:tableColumn headerText="$resource{i18n.common.name.header}" sort="name" rowHeader="$boolean{true}" id="col1">
        <sun:hyperlink id="link" text="#{td.value.name}" url="#{pageSession.editLink}?name=#{td.value.encodedName}" />
    </sun:tableColumn>

  </sun:tableRowGroup>

</sun:table>

  <sun:hidden id="helpKey" value="$resource{help_jca.resourceAdapterConfigs}" />
            </sun:form>
</define>
</composition>
