<!--

    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/mailResources.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.javaMailSessions.pageTitle}"
    guiTemplateOnLoad="admingui.nav.refreshTree('treeForm:tree:resources:mailResources');
        setTimeout('admingui.table.changeThreeTableButtons(\\\\\'#{pageSession.topActionGroup}\\\\\', \\\\\'#{pageSession.tableId}\\\\\');', 0);"
>
<!define name="content">
    <event>
    <!beforeCreate
        setPageSessionAttribute(key="childType" value="mail-resource");
        setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/resources");
        gf.restRequest(endpoint="#{sessionScope.REST_URL}/resources/mail-resource" method="GET" result="#{requestScope.resList}");
// FIXME: Move the following code to resourcesTable.inc and just endpoint(s?)
// FIXME: adjust all code that calls this to do the same.
//FIX ME: Will add a new file for getResourceRealStatus with the target Support.
<!--setAttribute(key="listOfRows" value={});
setAttribute(key="listOfRowsExtra" value={});
mapEntrySet("#{requestScope.resList.data.extraProperties.childResources}" set="#{requestScope.entries}");
foreach(var="entry" list="#{requestScope.entries}") {
    gf.restRequest(endpoint="#{requestScope.entry.value}" method="GET" result="#{requestScope.res}");
    listAdd(list="#{requestScope.listOfRows}" value="#{res.data.extraProperties.entity}");
    //selectiveEncode(value="#{res.data.extraProperties.entity.jndiName}" result="#{requestScope.encName}");
    gf.createAttributeMap(
	keys={"selected" /*"encodedName"*/},
	values={"$boolean{false}" /*"$attribute{encName}"*/},
	map="#{requestScope.tmpMap}");
    listAdd(list="#{requestScope.listOfRowsExtra}" value="#{requestScope.tmpMap}");
}-->
// FIXME: end

	// NOTE:  The old way of doing this... this is more complicated so I
	// NOTE:  removed it.  This pattern is done in other places, so I left
	// NOTE:  it in as a reminder to change those other places.
        
        setPageSessionAttribute(key="confirmDeleteMsg" value="$resource{i18njmail.msg.JS.confirmDeleteCR}");
        setPageSessionAttribute(key="createLink" value="#{request.contextPath}/full/mailResourceNew.jsf");
        setPageSessionAttribute(key="listLink" value="#{request.contextPath}/full/mailResources.jsf");
        setPageSessionAttribute(key="editLink" value="#{request.contextPath}/full/mailResourceEdit.jsf");
        setPageSessionAttribute(key="tableTitle" value="$resource{i18njmail.resourcesTable.sessions}");

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