<!--

    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

-->

<!-- full/externalResources.jsf -->
<!initPage
    setResourceBundle(key="i18n" bundle="org.glassfish.admingui.core.Strings");
    setResourceBundle(key="i18njmail" bundle="org.glassfish.full.admingui.Strings");
    setResourceBundle(key="help_jmail" bundle="org.glassfish.full.admingui.Helplinks")
/>
<!composition template="/templates/default.layout"
    guiTitle="$resource{i18njmail.externalResources.pageTitle}"
    guiTemplateOnLoad="admingui.nav.refreshTree('treeForm:tree:resources:jndi:externalResources');
        setTimeout('admingui.table.changeThreeTableButtons(\\\\\'#{pageSession.topActionGroup}\\\\\', \\\\\'#{pageSession.tableId}\\\\\'); admingui.table.initAllRows(\\\\\'#{pageSession.tableId}\\\\\');', 0);"
>
<!define name="content">
    <event>
    <!beforeCreate
        setPageSessionAttribute(key="childType" value="external-jndi-resource");
        //REST related
        setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/resources");
        setPageSessionAttribute(key="confirmDeleteMsg" value="$resource{i18njmail.msg.JS.confirmDeleteCR}");
        setPageSessionAttribute(key="createLink" value="#{request.contextPath}/full/externalResourceNew.jsf");
        setPageSessionAttribute(key="listLink" value="#{request.contextPath}/full/externalResources.jsf");
        setPageSessionAttribute(key="editLink" value="#{request.contextPath}/full/externalResourceEdit.jsf");
        setPageSessionAttribute(key="tableTitle" value="$resource{i18njmail.resourcesTable.resources}");

        setPageSessionAttribute(key="generalPage" value="#{request.contextPath}/full/externalResourceEdit.jsf");
        setPageSessionAttribute(key="targetPage" value="#{request.contextPath}/common/resourceNode/resourceEditTargets.jsf");
        
        setPageSessionAttribute(key="hasPool" value="#{false}" );
        setPageSessionAttribute(key="hasResType" value="#{true}" );
    />
    </event>
"    <script type="text/javascript">admingui.nav.selectTreeNodeById(admingui.nav.TREE_ID+":resources:jndi:externalResources");</script>
            <sun:form id="propertyForm">
#include "/common/shared/alertMsg_1.inc"
                 <sun:title id="propertyContentPage" title="$resource{i18njmail.externalResources.pageTitle}"
                 helpText="$resource{i18njmail.externalResources.pageTitleHelp}" />
		 "<br /> <br />

#include "/full/resourcesTable.inc"

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

