<!--

    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

-->

<!-- applications/applications.jsf -->


<!initPage
    setResourceBundle(key="i18n" bundle="org.glassfish.admingui.core.Strings")
    setResourceBundle(key="help" bundle="org.glassfish.common.admingui.Helplinks")
/>
<!composition template="/templates/default.layout"
    guiTitle="$resource{i18n.enterpriseApplications.title}"
    guiTemplateOnLoad="admingui.nav.refreshTree('treeForm:tree:applications');">
<!define name="content">
    <event>
        <!beforeCreate
            getRequestValue(key="filterValue" value=>$page{filterValue});
            gf.onlyDASExist(onlyDAS="#{pageSession.onlyDASExist}");
            createMap(result="#{requestScope.attrsMap}");
            mapPut(map="#{requestScope.attrsMap}"  key="target" value="domain");
            gf.restRequest( endpoint="#{sessionScope.REST_URL}/list-components" , attrs="#{requestScope.attrsMap}" method="GET"  result="#{requestScope.result}");
            gf.getDeployedAppsInfo(appPropsMap="#{requestScope.result.data.properties}" filterValue="#{pageSession.filterValue}", filters=>$attribute{filters} result=>$attribute{listOfRows} );
            setPageSessionAttribute(key="tableTitle" value="$resource{i18n.deployTable.applications}");
            setPageSessionAttribute(key="editLink" value="/common/applications/applicationEdit.jsf");
            setPageSessionAttribute(key="listPageLink" value="/common/applications/applications.jsf");
            setPageSessionAttribute(key="targetLink" value="/common/applications/targetListing.jsf");

            setPageSessionAttribute(key="nextPageLink" value="/common/applications/upload.jsf?cancelPage=#{pageSession.listPageLink}&listPageLink=#{pageSession.listPageLink}");
            setPageSessionAttribute(key="isLifecycle" value="#{false}");
            setPageSessionAttribute(key="confirmDeleteMsg" value="$resource{i18n.msg.JS.confirmUndeploy}");

        setSessionAttribute(key="gf_application_list_page" value="#{pageSession.listPageLink}");
        setSessionAttribute(key="gf_application_cancel_page" value="#{pageSession.listPageLink}");
        setSessionAttribute(key="gf_application_predefine_target" value="#{null}");
        setSessionAttribute(key="gf_application_extra_args" value="#{null}");


            <!--
            setPageSessionAttribute(key="viewKey" value="$pageSession{viewKeyValue}");
            setPageSessionAttribute(key="showDetail" value="$boolean{false}");
            setPageSessionAttribute(key="viewValue" value="summary");
            if ( !$session{$pageSession{viewKeyValue}} ){
                setPageSessionAttribute(key="showDetail" value="$boolean{true}");
                setPageSessionAttribute(key="viewValue" value="detail");
            }
            -->

        />
    </event>
"    <script type="text/javascript">admingui.nav.selectTreeNodeById(admingui.nav.TREE_ID+":applications");</script>
            <sun:form id="propertyForm">
#include "/common/shared/alertMsg_1.inc"
                <!-- Page Title -->
                 <sun:title id="propertyContentPage" title="$resource{i18n.enterpriseApplications.title}" helpText="$resource{i18n.enterpriseApplications.titleHelp}"/>
                 "<br />
#include "/common/applications/deployTable.inc"
	<sun:hidden id="helpKey" value="$resource{help.applications}" />
            </sun:form>
<f:verbatim>
    <script type="text/javascript">

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