<!--

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

-->

<!-- standalone/instances.jsf -->

<!initPage
    setResourceBundle(key="i18ncs" bundle="org.glassfish.cluster.admingui.Strings")
    setResourceBundle(key="i18nc" bundle="org.glassfish.common.admingui.Strings")
    setResourceBundle(key="help_cluster" bundle="org.glassfish.cluster.admingui.Helplinks");
/>
<!composition template="/templates/default.layout"
    guiTitle="$resource{i18ncs.standalone.ApplicationsTitle}"
    guiTemplateOnLoad="admingui.nav.refreshTree('treeForm:tree:applications');"
>

<!define name="content">
    <event>
    <!beforeCreate

        setSessionAttribute(key="standaloneInstanceTabs" value="standaloneApps");
        getRequestValue(key="instanceName" value="#{pageSession.instanceName}");
        urlencode(value="#{pageSession.instanceName}" encoding="UTF-8" result="#{pageSession.encodedInstanceName}");
        getRequestValue(key="filterValue" value=>$page{filterValue});
        setSessionAttribute(key="onlyDASExist" value="#{false}");
        createMap(result="#{pageSession.attrs}")
        mapPut(map="#{pageSession.attrs}"  key="target"  value="#{pageSession.instanceName}")
        gf.restRequest( endpoint="#{sessionScope.REST_URL}/list-components" , method="GET"  attrs="#{pageSession.attrs}" result="#{requestScope.result}");
        setPageSessionAttribute(key="appRefEndpoint" value="/servers/server/#{pageSession.encodedInstanceName}/application-ref/");
        gf.getSingleTargetAppsInfo(appPropsMap="#{requestScope.result.data.properties}" appRefEndpoint="#{pageSession.appRefEndpoint}" target="#{pageSession.instanceName}" filterValue="#{pageSession.filterValue}", filters="#{requestScope.filters}" result="#{requestScope.listOfRows}" );
        gf.isInstanceName(instanceName="#{pageSession.instanceName}");
        setPageSessionAttribute(key="editLink" value="/common/applications/applicationEdit.jsf");
        setPageSessionAttribute(key="listPageLink" value="/cluster/standalone/standaloneApplications.jsf");
        setPageSessionAttribute(key="extraArgs" value="instanceName=#{pageSession.encodedInstanceName}");
        setPageSessionAttribute(key="targetLink" value="/common/applications/targetListing.jsf");
        setPageSessionAttribute(key="nextPageLink" value="/common/applications/upload.jsf?listPageLink=#{listPageLink}&extraListArgs=#{pageSession.extraArgs}");
        setPageSessionAttribute(key="confirmDeleteMsg" value="$resource{i18n.msg.JS.confirmUndeploy}");
        setPageSessionAttribute(key="tableTitle" value="$resource{i18ncs.clusterApplications.TableTitle}");

        setSessionAttribute(key="gf_application_list_page" value="#{pageSession.listPageLink}");
        setSessionAttribute(key="gf_application_cancel_page" value="#{pageSession.listPageLink}");
        setSessionAttribute(key="gf_application_extra_args" value="#{pageSession.extraArgs}");
        setSessionAttribute(key="gf_application_predefine_target" value="#{pageSession.instanceName}");
    />
    
 </event>
"    <script type="text/javascript">admingui.nav.selectTreeNodeById(admingui.nav.TREE_ID+":standaloneTreeNode");</script>
            <sun:form id="propertyForm">
#include "/cluster/standalone/standaloneInstanceTabs.inc"

#include "/common/shared/alertMsg_1.inc"
                <!-- Page Title -->

<sun:title id="propertyContentPage" title="$resource{i18ncs.standalone.ApplicationsTitle}"
                 helpText="$resource{i18ncs.standalone.ApplicationsTitleHelp}" />

#include "/common/shared/nameSection.inc"

#include "/cluster/shared/appSingleTargetTable.inc"
<sun:hidden id="helpKey" value="$resource{help_cluster.standaloneApplications}" />

            </sun:form>
<f:verbatim>
    <script type="text/javascript">

    </script>
</f:verbatim>
</define>
</composition>


